package com.fwtai.builder;

/**
 * 雪花算法使用的参数
 * 参数说明，参考 README.md 的 “配置参数” 章节。
*/
public final class IdWorkerOptions{

  /**
   * 雪花计算方法 （1-漂移算法|2-传统算法），默认1
  */
  public short Method = 1;

  /**
   * 基础时间（ms单位）
   * 不能超过当前系统时间，应该是上线的时间，1582136402000
  */
  public long BaseTime = 1585541532000L;//约 2020-03-30 12:12:12,若取值是1985-01-17 12:12:12 则生成的是19位的,因为系统已运行了30多年了

  /*public static void main(final String[] args) throws ParseException{
    System.out.println(System.currentTimeMillis());
    String currentTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(1683709038126L);
    System.out.println(currentTime);
    System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("1985-01-17 12:12:12").getTime());
  }*/

  /**
   * 机器码,必须由外部设定，最大值 2^WorkerIdBitLength-1,必须先定义再传值到参数那。在默认配置下，ID可用 71000 年不重复;在支持 1024 个工作节点时，ID可用 4480 年不重复;在支持 4096 个工作节点时，ID可用 1120 年不重复。
  */
  public short WorkerId = 0;

  /**
   * 机器码位长,默认值6，取值范围 [1, 15]（要求：序列数位长+机器码位长不超过22）
  */
  public byte WorkerIdBitLength = 6;

  /**
   * 序列数位长,默认值6，取值范围 [3, 21]（要求：序列数位长+机器码位长不超过22）
  */
  public byte SeqBitLength = 6;

  /**
   * 最大序列数（含）,设置范围 [MinSeqNumber, 2^SeqBitLength-1]，默认值0，表示最大序列数取最大值（2^SeqBitLength-1]）
  */
  public short MaxSeqNumber = 0;

  /**
   * 最小序列数（含）,默认值5，取值范围 [5, MaxSeqNumber]，每毫秒的前5个序列数对应编号是0-4是保留位，其中1-4是时间回拨相应预留位，0是手工新值预留位
  */
  public short MinSeqNumber = 5;

  /**
   * 最大漂移次数（含）, 默认2000，推荐范围500-10000（与计算能力有关）,本机i7 7700hq,32GB内存测试,最好的记录是 TopOverCostCount=9000;WorkerIdBitLength=9;SeqBitLength=13;workerId = 1;耗时:32210毫秒,32秒,平均每秒:1718750
  */
  public short TopOverCostCount = 9000;

  public IdWorkerOptions(){}

  public IdWorkerOptions(final short workerId) {
    WorkerId = workerId;
  }
}